home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / telecomm / uwsrc.arc / WINMAIN.C < prev    next >
C/C++ Source or Header  |  1989-04-29  |  33KB  |  1,334 lines

  1. /* multi-window terminal emulation Version 0.2, May 29th 1986
  2.  *
  3.  * (C) Copyright 1986 Hans-Martin Mosner, University of Dortmund, Germany
  4.  * You may freely use and distribute this program as source
  5.  * and/or binary provided you make no profit with it.
  6.  */
  7.  
  8. #include <obdefs.h>
  9. #include <gemdefs.h>
  10. #include <osbind.h>
  11. #include <stdio.h>
  12. #include <bios.h>
  13. #include <xbios.h>
  14. #include "wind.h"
  15. #include "uw.h"
  16. #include "windefs.h"
  17.  
  18. #define FIRSTOBJ DABOUT
  19. #define LASTOBJ PRTSTOP
  20.  
  21.  
  22. /* global constants
  23.  */
  24.  
  25. extern    int        gl_apid;
  26. extern    struct    wi_str    w[];
  27.  
  28. int    contrl[12];
  29. int    intin[128];
  30. int    ptsin[128];
  31. int    intout[128];
  32. int    ptsout[128];
  33. int    work_in[11];
  34. int    work_out[57];
  35. int    pxyarray[20];
  36. int    msgbuff[8];
  37.  
  38. int    phys_handle, handle;
  39.  
  40. /*
  41.  * Variables used by various routines (miscellaneous).
  42.  */
  43.  
  44. long    dummy;                /* dummy return variable */
  45. int    scr_x, scr_y, scr_w, scr_h;    /* size of screen */
  46. int    key;                /* the key pressed */
  47. int    tmp;                /* temporary for anything... */
  48. char    alert[300];            /* used for alerts */
  49. int    xsiz, ysiz;            /* temporarys for size of window */
  50.  
  51. /*
  52.  * Character stuff (fonts, keymaps).
  53.  */
  54. FNT    *fnttbl[10];            /* List of pointers to fonts avail */
  55. int    fontsavail;            /* Number of fonts available */
  56. FNT    *tempfont;            /* font pointer */
  57. char    *oldshifted;            /* Pointer to old shifted key map. */
  58. char    *oldnormal;            /* Pointer to old normal key map. */
  59. char    *oldcapslock;            /* Pointer to old caps lock key map. */
  60. int    menu_key_map[0x80];        /* menu objects indexed by key map
  61.                        (alt key) read from object file */
  62. int fontmenuobj[] =            /* array of font menu object numbers */
  63.   { FNTBIG,
  64.     FNTSYS,
  65.     FNTOWN,
  66.     FNTALT,
  67.     FNTTINY,
  68.     FNTUNKNW,
  69.     /* Add new font menu items here! */
  70.     0
  71.   };
  72. extern    FNT    *loadfont();
  73.  
  74. /*
  75.  * State (loosely defined).
  76.  */
  77. int    tick;                /* used for flashing cursor */
  78. int    outport;            /* ports used with uw */
  79. int    inwind, outwind;        /* windows for input/output */
  80. int    uw_runs;            /* is uw running ? */
  81. FNT    *curfont;            /* font in use */
  82. int    mouse;                /* is mouse visible ? */
  83. int    menonoff;            /* Menu toggle. */
  84. int    m1inout;            /* mouse event  enter = 0  exit = 1 */
  85. int    sel_inp_mode;            /* input select with right button */
  86. extern int highlighted_wdes;        /* window with text highligted */
  87. #define LOCKLEN 30            /* Max length of lock password */
  88. char    lockword[LOCKLEN];        /* lock password */
  89. char    lockbld[LOCKLEN];        /* lock password build area*/
  90. extern int kermwdes;            /* port number for kermit window */
  91.  
  92. /*
  93.  * Options (somewhat loosely defined).
  94.  */
  95. int    fast;                /* flag for fast open/close */
  96. int    overstrike;            /* flag for character drawing */
  97. int    sliders;            /* flag for sliders on new windows */
  98. int    titles;                /* flag for titles on new windows */
  99. int    audibell;            /* Audible bell. */
  100. int    visibell;            /* Visible bell. */
  101. int    toponbel;            /* Top window on bell. */
  102.  
  103. FUNCSTRING fstrings[NFSTRINGS];        /* storage for function key bodys */
  104.  
  105. char    pastebuff[4096] = "";        /* 50 full lines of text */
  106.  
  107. char    confpath[80] = ".\\*.*";    /* initial config file path */
  108. char    confname[40] = "win.cnf";    /* initial config file name */
  109. int    confbutt;            /* button from fsel_input */
  110.  
  111. /*
  112.  * Screen forms, objects, and other similar goodies...
  113.  */
  114. MFDB    screen_mf;
  115.  
  116. OBJECT    *obj_tmp, *menubar;
  117. TEDINFO    *ted_tmp;
  118. TEDINFO    *ted_fnum;
  119.  
  120. extern struct iorec old_iorec;    /* copy of old rs_232 io record from winio.c */
  121.  
  122. MFORM    rmbmform[1];
  123. MFORM    lckmform[1];
  124.  
  125. #define    CHECKWIN    if (!outwind) break
  126.  
  127. /*
  128.  * The program code...
  129.  */
  130.  
  131. extern    char    *getmem();
  132. #ifdef    MWC
  133. #include <linea.h>
  134. #endif
  135.  
  136. /*
  137.  * If LOCATE is defined, it is assumed to be the path to check after
  138.  * "." for standard files (fonts, config files, etc.).
  139.  */
  140. #ifndef    LOCATE
  141. #define    locate(n)    n
  142. #else
  143. char    locpath[64] = LOCATE;
  144.  
  145. char    *
  146. locate (name)
  147. char    *name;
  148. {
  149.     int    fd;
  150.     static    char    new[80];
  151.  
  152.     close(fd = open(name, 0));
  153.     if (fd >= 0)
  154.         return (name);
  155.  
  156.     sprintf(new, "%s\\%s", locpath, name);
  157.     close(fd = open(new, 0));
  158.     return (fd >= 0? new: name);
  159. }
  160. #endif
  161.  
  162. startup()
  163. {
  164. int i,j;
  165. char *tmpfnt;
  166. static char my_shft_map[128];
  167. static char my_norm_map[128];
  168.  
  169. #ifndef    MWC
  170. register GEMFONT **a5;        /* this is really register A5 */
  171. #endif
  172.  
  173.   /* start up everything: appl_init, menu, and the like
  174.    */
  175.   appl_init();
  176.   rsrc_load(locate("wind.rsc"));
  177.   rsrc_gaddr(R_TREE, MENUBAR, &menubar);
  178.  
  179.   /*
  180.    * Fill menu_key_map by scaning object strings for ALTINDICATOR.
  181.    */
  182.   for (i = FIRSTOBJ; i <= LASTOBJ; i++)
  183.     if (menubar[i].ob_type == G_STRING)
  184.     {
  185.       char * found;
  186.       char * index();
  187.  
  188.       found = index((char *)menubar[i].ob_spec, ALTINDICATOR);
  189.       if (found != NULL)
  190.       {
  191.         menu_key_map[*(++found) & 0x7f] = i;
  192. #ifdef DEBUG
  193.         printf("menu_key_map[%c] = %d\n", *found, i);
  194. #endif
  195.       }
  196.     }
  197.  
  198. /*  objc_change(menubar, VISIBELL, 0, 0, 0, 0, 0, CHECKED, 0); *already done*/
  199.   menu_bar(menubar, menonoff = 1);
  200.   m1inout = 1;
  201.   audibell = 1;
  202.   visibell = 1;
  203.   sliders = 1;
  204.   titles = 1;
  205.  
  206.   /* set mouse symbol to arrow
  207.    */
  208.   graf_mouse(ARROW, NULL);
  209.   mouse = 1;
  210.  
  211.   /* get screen handle and sizes;
  212.    * open virtual workstation
  213.    */
  214.   phys_handle = graf_handle(&dummy, &dummy, &dummy, &dummy);
  215.   wind_get(0, WF_WORKXYWH, &scr_x, &scr_y, &scr_w, &scr_h);
  216.   for (i=0; i<10; work_in[i++]=1);
  217.   work_in[10] = 2;
  218.   handle = phys_handle;
  219.   v_opnvwk(work_in, &handle, work_out);
  220.  
  221.   /* set up screen mfdb
  222.    */
  223.  
  224.   screen_mf.ptr = NULL;
  225.   screen_mf.wpix = 640;
  226.   screen_mf.hpix = 400;
  227.   screen_mf.wwords = 40;
  228.   screen_mf.format = 0;
  229.   screen_mf.planes = 1;
  230.  
  231.   /*
  232.    * now set up the system fonts
  233.    */
  234.   fontsavail = 0;
  235.   if ((curfont = getmem((long)sizeof(FNT))) != NULL)
  236.   {
  237. #ifdef    MWC
  238.     linea0();
  239.     tmpfnt = la_init.li_a1[2]->font_data;    /* 8 x 16 system font */
  240. #else
  241.     asm("dc.w $a000");        /* get font addresses from line A */
  242.     asm("move.l a1,a5");        /* put it into A5 */
  243.     tmpfnt = a5[2]->ft_data;
  244. #endif
  245.     for (i=0; i<128; i++)
  246.       for (j=0; j<16; j++)
  247.         curfont->f_data[i*16+j] = tmpfnt[i+j*256];
  248.     curfont->inc_x = 8;
  249.     curfont->inc_y = 16;
  250.  
  251.     set_menu_string("8 x 16 sys font", fontmenuobj[fontsavail]);
  252.  
  253.     curfont->def_win_x = 80;    /* Set default window size */
  254.     curfont->def_win_y = 24;
  255.  
  256.     gen_hash(curfont, &curfont->f_hash);
  257.  
  258.     fnttbl[fontsavail] = curfont;
  259.     fontsavail++;
  260.   }
  261.   /* set up 6 x 6 system font */
  262.   if ((curfont = getmem((long)sizeof(FNT))) != NULL)
  263.   {
  264. #ifdef    MWC
  265.     linea0();
  266.     tmpfnt = la_init.li_a1[0]->font_data;
  267. #else
  268.     asm("dc.w $a000");        /* get font addresses from line A */
  269.     asm("move.l a1,a5");        /* put it into A5 */
  270.     tmpfnt = a5[0]->ft_data;
  271. #endif
  272.     for (i=0; i<128; i++){ /* for each character (first 128) */
  273.       int bitpos, index, offset;
  274.  
  275.       bitpos = i*6;
  276.       index = bitpos >> 3;
  277.       offset = bitpos & ~(~0<<3);
  278.       for (j=0; j<6; j++) /* for each pixel row in character */
  279.         curfont->f_data[i*16+j+1] = ((tmpfnt[index+j*192] << offset) +
  280.       (tmpfnt[index+j*192+1] >> (8-offset) & ~(~0<<offset)))>>2 & 63;
  281.       curfont->f_data[i*16+0] = 0; /* extra empty row */
  282.     }
  283.     curfont->inc_x = 6;
  284.     curfont->inc_y = 7;
  285.  
  286.     /*
  287.      * The 6x6 system font can be made better.  (dot the i etc.)
  288.      * This is a bad hack, but it makes it easier to read.
  289.      */
  290.     curfont->f_data[105*16+1] = 8;
  291.     curfont->f_data[105*16+2] = 0;
  292.     curfont->f_data[105*16+5] = 8;
  293.     curfont->f_data[106*16+5] = 20;
  294.     curfont->f_data[106*16+6] = 8;
  295.     curfont->f_data[106*16+2] = 0;
  296.  
  297.     curfont->def_win_x = 80;    /* Set default window size */
  298.     curfont->def_win_y = 40;
  299.  
  300.     set_menu_string("6 x 7 sys font", fontmenuobj[fontsavail]);
  301.     gen_hash(curfont, &curfont->f_hash);
  302.  
  303.     fnttbl[fontsavail] = curfont;
  304.     fontsavail++;
  305.   }
  306.  
  307.   /*
  308.    * Load font file(s) if any.
  309.    */
  310.  
  311.   if (curfont = loadfont("windstd.fnt")) /* yes, I want the assignment (=). */
  312.   {
  313.     objc_change(menubar, fontmenuobj[fontsavail-1], 0, 0, 0, 0, 0, CHECKED, 0);
  314.     curfont->def_win_x = 80;    /* Set default window size */
  315.     curfont->def_win_y = 24;
  316.   }
  317.   else {
  318.     objc_change(menubar, FNTSYS, 0, 0, 0, 0, 0, CHECKED, 0);
  319.     curfont = fnttbl[fontsavail - 1];
  320.   }
  321.  
  322.   if (tempfont = loadfont("windalt.fnt"))
  323.   {
  324.     tempfont->def_win_x = 80;    /* Set default window size */
  325.     tempfont->def_win_y = 32;
  326.   }
  327.  
  328.   if (tempfont =